package br.boicotando.persistencia;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "TIPO", discriminatorType = DiscriminatorType.STRING, length = 3)
@DiscriminatorValue("CAT")
@SuppressWarnings("serial")
public class ECategoria extends ESetor {

	@ManyToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
	@JoinColumn(name = "ID_SETOR")
	private ESetor setor;
	@OneToMany(mappedBy = "categoria", cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE})
	private Set<ESubCategoria> subCategorias;

	public ECategoria() {
		subCategorias = new HashSet<ESubCategoria>();
	}
	
	public ESetor getSetor() {
		return setor;
	}
	
	public void setSetor(ESetor setor) {
		if (this.setor != null && this.setor.contemCategoria(this)) {
			this.setor.removeCategoria(this);
		}
		this.setor = setor;
		if (setor != null && !setor.contemCategoria(this)) {
			setor.adicionaCategoria(this);
		}
	}

	public boolean adicionaSubCategoria(ESubCategoria s) {
		boolean adicionou = subCategorias.add(s);
		if (!equals(s.getCategoria())) {
			s.setCategoria(this);
		}
		return adicionou;
	}
	
	public boolean contemSubCategoria(ESubCategoria s) {
		return subCategorias.contains(s);
	}

	public ESubCategoria[] getSubCategorias(ESubCategoria[] a) {
		return subCategorias.toArray(a);
	}

	public boolean removeSubCategoria(ESubCategoria s) {
		boolean removeu = subCategorias.remove(s);
		if (equals(s.getCategoria())) {
			s.setCategoria(null);
		}
		return removeu;
	}

	public void removeSubcategorias() {
		for (ESubCategoria subCategoria : subCategorias) {
			subCategoria.setCategoria(null);
		}
	}

	@Override
	public boolean adicionaCategoria(ECategoria c) {
		if (setor == null) {
			return false;
		}
		return setor.adicionaCategoria(c);
	}

	@Override
	public boolean contemCategoria(ECategoria c) {
		if (setor == null) {
			return false;
		}
		return setor.contemCategoria(c);
	}

	@Override
	public ECategoria[] getCategorias(ECategoria[] a) {
		if (setor == null) {
		  return super.getCategorias(a);
		}
		return setor.getCategorias(a);
	}

	@Override
	public boolean removeCategoria(ECategoria c) {
		if (setor == null) {
			return false;
		}
		return setor.removeCategoria(c);
	}
		
}
